package com.baofu.trade.controller;

import com.baofu.trade.model.KlineData;
import com.baofu.trade.model.PriceBreakoutAnalysis;
import com.baofu.trade.model.PriceRange;
import com.baofu.trade.model.TakerLongShortRatio;
import com.baofu.trade.model.indicator.MACDResult;
import com.baofu.trade.service.BinanceApiService;
import com.baofu.trade.service.MarketDataService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * 市场数据控制器
 * 提供加密货币市场行情相关的REST API接口
 * 
 * 主要功能：
 * 1. 获取K线历史数据
 * 2. 获取实时最新价格
 * 3. 获取价格区间统计
 * 4. 获取关键价格位置分析
 */
@RestController
@RequestMapping("/api/market")
public class MarketDataController {

    @Autowired
    private MarketDataService marketDataService;

    @Autowired
    private BinanceApiService binanceApiService;

    /**
     * 获取历史K线数据
     * 
     * 功能说明：
     * - 获取指定交易对的历史K线数据，包含开盘价、最高价、最低价、收盘价、交易量等信息
     * - 支持多种时间周期的K线数据查询
     * - 可自定义获取的数据条数
     * 
     * 请求示例：
     * GET /api/market/kline?symbol=BTCUSDT&interval=1h&limit=100
     *
     * @param symbol   交易对符号（必填）
     *                 - 格式：基础货币+计价货币，例如：BTCUSDT, ETHUSDT, BNBUSDT
     *                 - 大小写不敏感
     * @param interval K线时间周期（必填）
     *                 - 1m：1分钟
     *                 - 5m：5分钟
     *                 - 15m：15分钟
     *                 - 30m：30分钟
     *                 - 1h：1小时
     *                 - 4h：4小时
     *                 - 1d：1天
     *                 - 1w：1周
     * @param limit    获取K线数量（选填）
     *                 - 默认值：500
     *                 - 有效范围：[1-1000]
     *                 - 超出范围将使用默认值
     * @return K线数据列表，按时间升序排列
     */
    @GetMapping("/kline")
    public List<KlineData> getKlineData(
            @RequestParam String symbol,
            @RequestParam String interval,
            @RequestParam(required = false, defaultValue = "500") Integer limit) {
        return marketDataService.getKlineData(symbol, interval, limit);
    }

    /**
     * 获取最新市场价格
     * 
     * 功能说明：
     * - 获取指定交易对的最新成交价格
     * - 价格实时更新，反映当前市场状态
     * - 适用于需要实时价格监控的场景
     * 
     * 请求示例：
     * GET /api/market/price?symbol=BTCUSDT
     *
     * @param symbol 交易对符号（必填）
     *              - 格式：基础货币+计价货币，例如：BTCUSDT, ETHUSDT
     *              - 大小写不敏感
     * @return 最新价格，以字符串形式返回，保留原始精度
     */
    @GetMapping("/price")
    public String getLatestPrice(@RequestParam String symbol) {
        return marketDataService.getLatestPrice(symbol);
    }

    /**
     * 获取指定周期内的价格区间统计
     * 
     * 功能说明：
     * - 统计指定时间周期内的最高价和最低价
     * - 可用于价格波动范围分析
     * - 支持自定义统计周期和时间范围
     * 
     * 请求示例：
     * GET /api/market/high-low?symbol=BTCUSDT&interval=1d&limit=7
     *
     * @param symbol   易对符号（必填）
     *                 - 格式：基础货币+计价货币，例如：BTCUSDT, ETHUSDT
     * @param interval 统计周期（必填）
     *                 - 支持的值同K线周
     * @param limit    统计周期数量（选填）
     *                 - 默认值：7
     *                 - 例如：7表示最近7个统计周期
     * @return 包含最高价和最低价的Map
     *         - key: "high" - 最高价
     *         - key: "low" - 最低价
     */
    @GetMapping("/high-low")
    public Map<String, String> getHighLowPrice(
            @RequestParam String symbol,
            @RequestParam String interval,
            @RequestParam(required = false, defaultValue = "7") Integer limit) {
        return marketDataService.getHighLowPrice(symbol, interval, limit);
    }

    /**
     * 获取市场关键价格位置分析
     * 
     * 功能说明：
     * - 分析并返回重要的价格支撑位和力位
     * - 基于历史交易数据的技术分析
     * - 可用于辅助交易决策
     * 
     * 技术指标：
     * - 支持位：近期价格趋势中的重要支撑位置
     * - 阻力位：近期价格趋势中的重要阻力位置
     * - 移动平均线：包含MA7、MA25、MA99等
     * 
     * 请求示例：
     * GET /api/market/key-levels?symbol=BTCUSDT&interval=1d&limit=20
     *
     * @param symbol   交易对符号（必填）
     *                 - 格式：基础货币+计价货币
     * @param interval 分析周期（选填）
     *                 - 默认值：1d（日线）
     * @param limit    分析数据量（选填）
     *                 - 默认值：20
     *                 - 建议范围：[10-100]
     * @return 关键价格位置Map
     *         - key: "support" - 支撑位
     *         - key: "resistance" - 阻力位
     *         - key: "ma7" - 7日均线
     *         - key: "ma25" - 25日均线
     *         - key: "ma99" - 99日均线
     */
    @GetMapping("/key-levels")
    public Map<String, String> getKeyLevels(
            @RequestParam String symbol,
            @RequestParam(defaultValue = "1d") String interval,
            @RequestParam(defaultValue = "20") Integer limit) {
        return marketDataService.getKeyLevels(symbol, interval, limit);
    }

    /**
     * 获取合约K线数据
     * 
     * 功能说明：
     * - 获取指定交易对的期货K线数据，包含开盘价、最高价、最低价、收盘价、交易量等信息
     * - 支持多种时间周期的K线数据查询
     * - 可自定义获取的数据条数和时间范围
     * 
     * 请求示例
     * GET /api/market/futures/klines?symbol=BTCUSDT&interval=1h&startTime=1609459200000&endTime=1609545600000&limit=100
     *
     * @param symbol   交易对符号（必填）
     *                 - 格式：基础货币+计价货币，例如：BTCUSDT, ETHUSDT, BNBUSDT
     *                 - 大小写不敏感
     * @param interval K线时间周期（必填）
     *                 - 1m：1分钟
     *                 - 5m：5分钟
     *                 - 15m：15分钟
     *                 - 30m：30分钟
     *                 - 1h：1小时
     *                 - 4h：4小时
     *                 - 1d：1天
     *                 - 1w：1周
     * @param startTime 开始时间（选填）
     *                  - 毫秒级时间戳
     *                  - 若不填，则从最早的数据开始
     * @param endTime   结束时间（选填）
     *                  - 毫秒级时间戳
     *                  - 若不填，则获取到最新的数据
     * @param limit     获取K线数量（选填）
     *                  - 默认值：500
     *                  - 有效范围：[1-1000]
     *                  - 超出范围将使用默认值
     * @return 期货K线数据列表，按时间升序排列
     */
    @GetMapping("/futures/klines")
    public List<KlineData> getFuturesKlineData(
            @RequestParam String symbol,
            @RequestParam String interval,
            @RequestParam(required = false) Long startTime,
            @RequestParam(required = false) Long endTime,
            @RequestParam(required = false, defaultValue = "500") Integer limit) {
        return marketDataService.getFuturesKlineData(symbol, interval, startTime, endTime, limit);
    }

    /**
     * 获取合约主动买卖量数据
     * 
     * 功能说明：
     * - 获取指定交易对的合约主动买卖量数据
     * - 支持多种时间周期的数据查询
     * - 可自定义获取的数据条数和时间范围
     * - 仅支持最近30天的数据
     * 
     * 请求示例：
     * GET /api/market/taker-ratio?symbol=BTCUSDT&period=1h&limit=100
     *
     * @param symbol    交易对符号（必填）
     *                  - 格式：基础货币+计价货币，例如：BTCUSDT
     * @param period    时间周期（必填）
     *                  - 可选值：5m,15m,30m,1h,2h,4h,6h,12h,1d
     * @param limit     获取量（选填）
     *                  - 默认值：30
     *                  - 最大值：500
     * @param startTime 开始时间（选填）
     *                  - 毫秒级时间戳
     * @param endTime   结束时间（选填）
     *                  - 毫秒级时间戳
     * @return 主动买卖量数据列表
     */
    @GetMapping("/taker-ratio")
    public List<TakerLongShortRatio> getTakerLongShortRatio(
            @RequestParam String symbol,
            @RequestParam String period,
            @RequestParam(required = false, defaultValue = "30") Integer limit,
            @RequestParam(required = false) Long startTime,
            @RequestParam(required = false) Long endTime) {
        
        return binanceApiService.getTakerLongShortRatio(
                symbol, period, limit, startTime, endTime);
    }

    /**
     * 获取MACD技术指标
     * 
     * 功能说明：
     * - 计算并返回指定交易对的MACD指标值
     * - 包含DIF、DEA和MACD柱状值
     * - 提供趋势判断和柱状图颜色标识
     * 
     * 请求示例：
     * GET /api/market/macd?symbol=BTCUSDT&interval=1d&limit=100
     *
     * @param symbol   交易对符号
     * @param interval K线周期
     * @param limit    K线数量(建议至少35根,因为需要计算26日EMA)
     * @return MACD指标数据
     */
    @GetMapping("/macd")
    public MACDResult getMACD(
            @RequestParam String symbol,
            @RequestParam(defaultValue = "1d") String interval,
            @RequestParam(defaultValue = "100") Integer limit) {
        return marketDataService.getMACD(symbol, interval, limit);
    }

    /**
     * 获取历史K线数据
     * 
     * 功能说明：
     * - 获取指定时间范围内的K线数据
     * - 支持多种时间周期的数据查询
     * - 数据包含开盘价、最高价、最低价、收盘价、成交量等信息
     * - 最多返回1500条数据
     * 
     * 请求示例：
     * 1. 获取日K线数据：
     * GET /api/market/kline/history?symbol=BTCUSDT&interval=1d&startTime=2023-11-16 00:00:00&endTime=2024-11-16 23:59:59&limit=500
     * 
     * 2. 获取小时K线数据：
     * GET /api/market/kline/history?symbol=BTCUSDT&interval=1h&startTime=2024-03-01 00:00:00&endTime=2024-03-02 00:00:00&limit=24
     * 
     * 3. 获取分钟K线数据：
     * GET /api/market/kline/history?symbol=BTCUSDT&interval=1m&startTime=2024-03-01 09:00:00&endTime=2024-03-01 10:00:00&limit=60
     *
     * @param symbol 交易对符号（必填）
     *              - 格式：基础货币+计价货币，例如：BTCUSDT, ETHUSDT
     *              - 大小写不敏感
     * @param interval 时间间隔（必填）
     *              - 1m：1分钟
     *              - 3m：3分钟
     *              - 5m：5分钟
     *              - 15m：15分钟
     *              - 30m：30分钟
     *              - 1h：1小时
     *              - 2h：2小时
     *              - 4h：4小时
     *              - 6h：6小时
     *              - 8h：8小时
     *              - 12h：12小时
     *              - 1d：1天
     *              - 3d：3天
     *              - 1w：1周
     *              - 1M：1月
     * @param startTime 开始时间（必填）
     *              - 格式：yyyy-MM-dd HH:mm:ss
     *              - 例如：2024-03-01 00:00:00
     * @param endTime 结束时间（必填）
     *              - 格式：yyyy-MM-dd HH:mm:ss
     *              - 例如：2024-03-02 00:00:00
     * @param limit 获取数量（选填）
     *              - 默认值：500
     *              - 最大值：1500
     *              - 建议根据时间间隔和时间范围合理设置
     * @return K线数据列表，包含以下字段：
     *         - ��盘时间：Unix时间戳（毫秒）和北京时间
     *         - 开盘价
     *         - 最高价
     *         - 最低价
     *         - 收盘价
     *         - 成交量
     *         - 收盘时间：Unix时间戳（毫秒）和北京时间
     *         - 成交额
     *         - 成交笔数
     *         - 主动买入成交量
     *         - 主动买入成交额
     * @throws IllegalArgumentException 当参数验证失败时抛出
     */
    @GetMapping("/kline/history")
    public List<KlineData> getHistoricalKlineData(
            @RequestParam String symbol,
            @RequestParam String interval,
            @RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime startTime,
            @RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime endTime,
            @RequestParam(required = false) Integer limit) {
        
        // 参数验证
        if (startTime.isAfter(endTime)) {
            throw new IllegalArgumentException("开始时间不能晚于结束时间");
        }

        return marketDataService.getHistoricalKlineData(symbol, interval, startTime, endTime, limit);
    }

    /**
     * 获取指定天数的价格极值
     * 
     * 功能说明：
     * - 获取从昨天往前推指定天数的价格最高点和最低点
     * - 计算价格波动幅度
     * - 返回价格出现的具体时间
     * 
     * 请求示例：
     * GET /api/market/price-range?symbol=BTCUSDT&interval=1d&days=15
     *
     * @param symbol 交易对符号（必填）
     * @param interval K线间隔（选填，默认1d）
     * @param days 统计天数（选填，默认15）
     * @return 价格极值信息
     */
    @GetMapping("/price-range")
    public PriceRange getPriceRange(
            @RequestParam String symbol,
            @RequestParam(defaultValue = "1d") String interval,
            @RequestParam(defaultValue = "15") int days) {
        return marketDataService.getPriceRange(symbol, interval, days);
    }

    /**
     * 分析价格突破情况
     * 
     * 功能说明：
     * - 分析价格是否突破前期高点或低点
     * - 计算价格在区间中的位置
     * - 返回详细的分析结果
     * 
     * 请求示例：
     * GET /api/market/price-breakout?symbol=BTCUSDT&interval=1d&days=15
     *
     * @param symbol 交易对符号（必填）
     * @param interval K线间隔（选填，默认1d）
     * @param days 统计天数（选填，默认15）
     * @return 价格突破分析结果
     */
    @GetMapping("/price-breakout")
    public PriceBreakoutAnalysis analyzePriceBreakout(
            @RequestParam String symbol,
            @RequestParam(defaultValue = "1d") String interval,
            @RequestParam(defaultValue = "15") int days) {
        return marketDataService.analyzePriceBreakout(symbol, interval, days);
    }
} 